package com.yuw.db;

import java.sql.*;

public class DBProvider {
    // 行为

    /**
     * 获取数据库连接对象
     *
     * @return 数据库连接对象
     */
    public Connection getConn() {
        // 返回对象
        Connection connection = null;

        // （1）加载数据库驱动；
        // 数据库连接串 -- 指明数据库连接的方式 【不同数据库连接串不一样】
        // 连接串中的 localhost 表示本机，也可以使用 127.0.0.1表示本机
        // 还可以使用数据库服务器在局域网中的服务器名，或者ip地址
        // Mysql 8.x
        String strURLMysql8 = "jdbc:mysql://localhost:3306/tjise202103?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true";
        // Mysql 5.x ？
        String strURLMysql5 = "jdbc:mysql://localhost:3306/tjise202103?useUnicode=true&characterEncoding=utf8";
        // Oracle
        String strURLOracle = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl 表示Oracle数据库安装的实例名，默认是orcl，如果不是默认，则改成自己的

        // 数据库的驱动类名
        // Mysql 8.x
        String strDriverClassNameMysql8 = "com.mysql.cj.jdbc.Driver";
        // Mysql 5.x
        String strDriverClassNameMysql5 = "com.mysql.jdbc.Driver";
        // Oracle
        String strDriverClassNameOracle = "oracle.jdbc.driver.OracleDriver";
        // 数据库用户名
        String strUserName = "root"; // 改成自己的
        // 数据库密码
        String strUserPsw = "root"; // 改成自己的
        try {
            // 加载数据库驱动类 -- 反射
            Class.forName(strDriverClassNameMysql8); // 需要根据数据库进行调换

            // （2）获取数据库连接对象 Connection；
            // 第一个参数是数据库连接串，需要根据数据库调换
            connection = DriverManager.getConnection(strURLMysql8, strUserName, strUserPsw);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }

    /**
     * 使用问号占位符进行数据库操作
     *
     * @return 返回结果集
     */
    public int test01(String stuName, String stuNum, String stuSex, int stuScore) {
        int result = 0;
        try {
            String strSql = "insert into stuinfo(stuName,stuNum,stuSex,stuscore) VALUES(?,?,?,?)";

            // （3）通过数据库连接获取查询器对象 Statement或者PreparedStatement；
            PreparedStatement statement = getConn().prepareStatement(strSql);
            // 设置参数
            statement.setObject(1, stuName);
            statement.setObject(2, stuNum);
            statement.setObject(3, stuSex);
            statement.setObject(4, stuScore);


            // （4）准备数据库操作的SQL语句；
            //String strSql = "select * from stuInfo";
            // （5）执行数据库操作SQL语句，获取查询结果集ResultSet或者是运行结果；
            result = statement.executeUpdate();
            System.out.println("执行结果：" + result);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return result;
    }


    /**
     * 使用问号占位符进行数据库操作
     *
     * @param strSql sql语句
     * @param params sql语句中的问号占位符的参数数组
     * @return 返回结果集
     */
    public int updateorinsertordelete(String strSql, Object[] params) {
        int result = 0;
        try {
            // （3）通过数据库连接获取查询器对象 Statement或者PreparedStatement；
            PreparedStatement statement = getConn().prepareStatement(strSql);
            // 设置参数
            // 使用for循环设置参数
            if (params != null) {
                for (int i = 0; i < params.length; i++) {
                    statement.setObject(i + 1, params[i]);
                }
            }

            // （4）准备数据库操作的SQL语句；
            //String strSql = "select * from stuInfo";
            // （5）执行数据库操作SQL语句，获取查询结果集ResultSet或者是运行结果；
            result = statement.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return result;
    }

    /**
     * 使用jdbc进行查询操作
     *
     * @param strSql 查询sql语句
     * @return 查询结果集
     */
    public ResultSet query(String strSql) {
        // 返回结果集
        ResultSet resultSet = null;
        try {
            // （3）通过数据库连接获取查询器对象 Statement或者PreparedStatement；
            Statement statement = getConn().createStatement();
            // （4）准备数据库操作的SQL语句；
            //String strSql = "select * from stuInfo";
            // （5）执行数据库操作SQL语句，获取查询结果集ResultSet或者是运行结果；
            resultSet = statement.executeQuery(strSql);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return resultSet;
    }
}
